# Simple Bash Utils

Разработка утилит Bash по работе с текстом: cat, grep.

## Contents

0. [Preamble](#preamble)
1. [Chapter I](#chapter-i) \
    1.1. [Introduction](#introduction)
2. [Chapter II](#chapter-ii) \
    2.1. [Information](#information)
3. [Chapter III](#chapter-iii) \
    3.1. [Part 1](#part-1-работа-с-утилитой-cat)  
    3.2. [Part 2](#part-2-работа-с-утилитой-grep)  
    3.3. [Part 3](#part-3-дополнительно-реализация-некоторых-флагов-утилиты-grep)  
    3.4. [Part 4](#part-4-дополнительно-реализация-комбинаций-флагов-утилиты-grep) 


## Preamble

![simple_bash_utils](misc/rus/images/bashutils.png)

Стоял обычный серый день осенью 1993 года. После напряженного рабочего дня в Hewlett-Packard ты наконец вернулся домой. У тебя небольшая двухкомнатная квартирка на окраине города N, а в холодильнике так кстати завалялась баночка слабоалкогольного напитка под названием pivo. Взяв его и пачку крекеров, ты уселся в свое укромное местечко перед компьютером Dell.

`*Щелчок*` — это ты нажал кнопку включения. Придется пару минут подождать, пока компьютер загружается, но… это приятное чувство. Ты всегда радуешься, когда включаешь свой Dell. Пара секунд неподвижного наслаждения, и вот ты уже открываешь браузер Mosaic, заходишь на любимый форум и листаешь треды, попивая pivo. И вдруг натыкаешься на очень интересное обсуждение, первое сообщение в котором следующее: 

> Hello everybody out there using minix -
>
>I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things).
>
>I've currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I'll get something practical within a few months, and I'd like to know what features most people would want. Any suggestions are welcome, but I won't promise I'll implement them :-)
>
>Linus (torvalds@kruuna.helsinki.fi)
>
>PS. Yes - it's free of any minix code, and it has a multi-threaded fs. It is NOT portable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that's all I have :-(.
>
>— Linus Torvalds

«Очень любопытно», — подумал ты. Пролистав тред ниже, ты заметил ошибки в портировании Bash и то, что некоторые функции не работают. В частности, возникли проблемы с командами чтения файлов: cat и grep. 
«А задачка-то интересная, заодно смогу помочь этому Линусу Торвальдсу», — сказал ты себе и написал в треде, что уже начал работать над этой проблемой. Что ж, за дело!

## Chapter I

## Introduction

В этом проекте тебе предстоит познакомиться с базовыми утилитами Bash по работе с текстами на языке программирования С и научиться их разрабатывать. Эти утилиты (cat и grep) достаточно часто используются при работе в терминале Linux. В рамках этого проекта ты также узнаешь, как организованы утилиты Bash, и научишься структурному подходу.  


## Chapter II

## Information

### История cat

> cat был частью ранних версий Unix, например, Версии 1, и заменил pr, утилиту PDP-7 и Multics для копирования одного файла на экран.

### Использование cat

cat - одна из наиболее часто используемых команд в Unix-подобных операционных системах. Команда имеет три взаимосвязанные функции в отношении текстовых файлов: отображение, объединение их копий и создание новых.

`cat [OPTION] [FILE]...`

### Опции cat

| № | Опции | Описание |
| ------ | ------ | ------ |
| 1 | -b (GNU: --number-nonblank) | нумерует только непустые строки |
| 2 | -e предполагает и -v (GNU only: -E то же самое, но без применения -v) | также отображает символы конца строки как $  |
| 3 | -n (GNU: --number) | нумерует все выходные строки |
| 4 | -s (GNU: --squeeze-blank) | сжимает несколько смежных пустых строк |
| 5 | -t предполагает и -v (GNU: -T то же самое, но без применения -v) | также отображает табы как ^I |

### История grep 

> Томпсон написал первую версию на PDP-11 языке ассемблера, чтобы помочь Ли Э. МакМахону проанализировать текст «Записок Федералиста» и определить авторство отдельных статей. Текстовый редактор ed (также созданный Томпсоном) имел поддержку регулярных выражений, но его нельзя было использовать для такого большого объема текста, поэтому Томпсон извлек этот код в отдельный инструмент. Он выбрал это название, потому что в ed команда g / re / p печатала все строки, соответствующие заданному шаблону. 
grep впервые был включен в Версию 4 Unix. Заявив, что он «обычно упоминается как прототип программного средства», Макилрой приписал grep «безвозвратное внедрение» философии инструментов Томпсона в Unix.

### Использование grep 

`grep [options] template [file_name]`

### Опции grep 

| № | Опции | Описание |
| ------ | ------ | ------ |
| 1 | -e | Шаблон. |
| 2 | -i | Игнорирует различия регистра.  |
| 3 | -v | Инвертирует смысл поиска соответствий. |
| 4 | -c | Выводит только количество совпадающих строк. |
| 5 | -l | Выводит только совпадающие файлы.  |
| 6 | -n | Предваряет каждую строку вывода номером строки из файла ввода. |
| 7 | -h | Выводит совпадающие строки, не предваряя их именами файлов. |
| 8 | -s | Подавляет сообщения об ошибках о несуществующих или нечитаемых файлах. |
| 9 | -f file | Получает регулярные выражения из файла. |
| 10 | -o | Печатает только совпадающие (непустые) части совпавшей строки. |


## Chapter III

- Программы должны быть разработаны на языке С стандарта C11 с использованием компилятора gcc.
- Код программ cat и grep должен находиться в ветке develop в папках src/cat/ и src/grep/ соответственно. 
- Не используй устаревшие и выведенные из употребления конструкции языка и библиотечные функции. Обращай внимание на пометки legacy и obsolete в официальной документации по языку и используемым библиотекам. Ориентируйся на стандарт POSIX.1-2017.
- При написании кода необходимо придерживаться Google Style.
- Программы должны представлять собой исполняемый файл с аргументами командной строки
- Сборка программ должна быть настроена с помощью Makefile с соответствующими целями: s21_cat, s21_grep.
- Если используешь сторонние библиотеки, в Makefile должны быть заложены сценарии сборки, предусматривающие их подключение/загрузку.
- Необходимо покрытие интеграционными тестами для всех вариантов флагов и входных значений, на базе сравнения с поведением реальных утилит Bash.
- Программа должна быть разработана в соответствии с принципами структурного программирования.
- Необходимо исключить дублирование кода, переиспользовать общие модули между утилитами. Общие модули можно вынести в отдельную папку src/common.
- Можно использовать стандартные и нестандартные библиотеки языка С, а можно собственноручно разработанные библиотеки из других проектов.
- Формулировка сообщения при возникновении ошибочной ситуации не имеет значения.
- Ввод через stdin обрабатывать не обязательно.


## Part 1. Работа с утилитой cat

Тебе необходимо разработать утилиту cat:
- Она должна поддерживать все флаги (включая GNU версии), указанные [выше](#cat-опции)
- Исходные, заголовочные и сборочный файлы должны располагаться в директории src/cat/
- Итоговый исполняемый файл должен располагаться в директории src/cat/ и называться s21_cat

## Part 2. Работа с утилитой grep

Тебе необходимо разработать утилиту grep:
- Поддержка следующих флагов: `-e`, `-i`, `-v`, `-c`, `-l`, `-n`
- Для регулярных выражений можно использовать только библиотеки pcre или regex  
- Исходные, заголовочные и make файлы должны располагаться в директории src/grep/
- Итоговый исполняемый файл должен располагаться в директории src/grep/ и называться s21_grep

## Part 3. Дополнительно. Реализация некоторых флагов утилиты grep

А это необязательное задание на дополнительные баллы: разработай утилиту grep:
- Поддержка всех флагов, включая: `-h`, `-s`, `-f`, `-o`
- Для регулярных выражений можно использовать только библиотеки pcre или regex  
- Исходные, заголовочные и make файлы должны располагаться в директории src/grep/
- Итоговый исполняемый файл должен располагаться в директории src/grep/ и называться s21_grep

## Part 4. Дополнительно. Реализация комбинаций флагов утилиты grep

А это необязательное задание на дополнительные баллы: разработай утилиту grep:
- Поддержка всех флагов, включая их _парные_ комбинации (например, `-iv`, `-in`)
- Для регулярных выражений можно использовать только библиотеки pcre или regex
- Исходные, заголовочные и make файлы должны располагаться в директории src/grep/
- Итоговый исполняемый файл должен располагаться в директории src/grep/ и называться s21_grep

💡 [Нажми сюда](https://forms.yandex.ru/cloud/64144c1bc09c020aafe7a4f3/), **чтобы поделиться с нами обратной связью на этот проект**. Это анонимно и поможет команде Продукта сделать твоё обучение лучше.
